//团伙
#include <iostream>
#include <vector>
using namespace std;
const int MAXN=1000;
int n,m;
struct UFS{
    int father[MAXN+1];
    void init(){
        for(int x=1;x<=MAXN;x++) father[x]=x;
    }
    int find_set(int x){
        if (father[x]!=x) father[x]=find_set(father[x]);
        return father[x];
    }
    void union_set(int x,int y){
        int fx=find_set(x);
        int fy=find_set(y);
        father[fy]=fx;
    }
};
vector<int> enemy[MAXN+1];
UFS ufs;
int main(){
    cin>>n>>m;
    ufs.init();
    for(int i=1;i<=m;i++){
        int p,x,y;
        cin>>p>>x>>y;
        if (p==0) ufs.union_set(x,y);
        else {
            enemy[x].push_back(y);
            enemy[y].push_back(x);
        }
    }
    
    
    for(int x=1;x<=n;x++){
        for(int k=0;k<enemy[x].size();k++){
            int y=enemy[x][k];
            for(int k1=0;k1<enemy[y].size();k1++){
                int z=enemy[y][k1];
                if (x!=z) ufs.union_set(x,z);
            }
        }
    }

    int count=0;
    for(int x=1;x<=n;x++) if (ufs.find_set(x)==x) count++;
    cout<<count;
}